﻿/********************************************************************************
** @ Date:2025/05/12
** @ Author: Gaojia
** @ Description:
** @ Version:1.0.0
** @ Fun:
********************************************************************************/
#ifndef CRobCtrOper_H
#define CRobCtrOper_H
#include "CDevDataBase.h"
#include "CModBusOper.h"
#include <qobject.h>
#include <qapplication.h>
#include <qdir.h>
#include <qtextstream.h>
#include "CLogOper.h"
#define def_refreshTime 500

class CRobCtrOper :
	public QObject
{
	Q_OBJECT

public:
	CRobCtrOper(CDevDataBase *pDevDataRob);
	~CRobCtrOper();
	bool ctrDevice(SCtrInfo& stCtrInfo);
	bool getRobDevData();                                  //获取机器人PLC数据，在上层RobCtrMange线程的定时器中调用
	void writeCsvLog();//将机器人实时数据写入Csv
private:
	void initModBus();                                     //初始化modbus
	bool moveForward(SCtrInfo& stCtrInfo);                 //前进
	bool moveBackward(SCtrInfo& stCtrInfo);                //后退
	bool moveUp(SCtrInfo& stCtrInfo);                      //向上
	bool moveDown(SCtrInfo& stCtrInfo);                    //向下
	bool moveStopRun(SCtrInfo& stCtrInfo);                 //停止运动
	bool suddenStop(SCtrInfo& stCtrInfo);                  //急停
	bool setSpeed(SCtrInfo& stCtrInfo);                    //调速
	bool initRob(SCtrInfo& stCtrInfo);                     //机器人位置初始化
	bool startCharging(SCtrInfo& stCtrInfo);               //一键充电
	bool stopCharging(SCtrInfo& stCtrInfo);                //停止充电
	bool forceCharge(SCtrInfo& stCtrInfo);                 //强制充电
	bool moveToPosition(SCtrInfo& stCtrInfo);              //运动到指定位置
	bool moveToPositionZ(SCtrInfo& stCtrInfo);             //升降机运动到指定位置
	bool setSpeedZ(SCtrInfo& stCtrInfo);                   //升降机调速
	bool initRobZ(SCtrInfo& stCtrInfo);                    //升降机回原点
	bool manualRunUp(SCtrInfo& stCtrInfo);			       //手动强制上升
	bool manualRunDown(SCtrInfo& stCtrInfo);		       //手动强制下降
	bool resetAlarm(SCtrInfo& stCtrInfo, int nReset);      //报警复位
	bool execTask(SCtrInfo& stCtrInfo);                    //执行任务
	bool suspendTask(SCtrInfo& stCtrInfo);                 //暂停任务
	bool restartTask(SCtrInfo& stCtrInfo);                 //恢复任务
	bool abortTask(SCtrInfo& stCtrInfo);                   //中止任务
	bool changeMode(SCtrInfo& stCtrInfo, int nType);       //模式切换
	bool gotoFlush(SCtrInfo& stCtrInfo, int nVal);	       //一键冲洗
	bool alarmRemain(SCtrInfo& stCtrInfo, int nVal);       //报警停留
	bool resetWorkState(SCtrInfo& stCtrInfo);		       //复位工作状态
	bool closeBrake(SCtrInfo& stCtrInfo, int nResrt);      //分闸
	bool releseBrake(SCtrInfo& stCtrInfo, int nResrt);     //松闸
	bool setLabelMode(SCtrInfo& stCtrInfo, int nResrt);    //设置标签模式
	bool setLabelReset(SCtrInfo& stCtrInfo, int nResrt);   //标签复位
	bool motorZeroClear(SCtrInfo& stCtrInfo, int nResrt);  //电机清零
	bool manualConfirm(SCtrInfo& stCtrInfo, int nResrt);   //手动确认
	bool autoConfirm(SCtrInfo& stCtrInfo, int nResrt);     //自动确认
	bool directionSelect(SCtrInfo& stCtrInfo, int nVal);   //方向选择
	bool ParameterDistribut(SCtrInfo& stCtrInfo, int nVal);//参数下发
	bool isSave(SCtrInfo& stCtrInfo, int nVal);            //是否保存
	bool readRobCfg(SCtrInfo& stCtrInfo);                  //读取PLC中的参数设置，并将读到的数据保存在DevData中
	void SetAddrData(QVector<int>vecReVal, int nIndex = 1, int nType = 0);     //将读取的数据对应到m_sVecAddrData里面
	bool writePlcValue(SCtrInfo& stCtrInfo);//上层执行写PLC数据
private:
	/**
	* @ Author: Gaojia
	* @ Description:  读写数据
	*/
	int execCmd(int nCmd);                               //执行命令
	int writeData(int nAddr, int nData = 0);             //执行一些写值命令或者数据
	int execCmd(int nCmd, int nAddr, int nVal = -1);     //执行命令  nAddr地址枚举   nVal写入的值
	int execCmdEx(int nCmd, int nAddr, int nVal = -1);   //执行任务命令  nAddr地址枚举   nVal写入的值
	int resetExecData(int nType = 0);                    //遥控模式 复位执行数据 nType=0 复位 控制命令 控制命令反馈 命令执行结果  nType=1  复位 控制命令反馈 命令执行结果
	int resetTaskExecData();                             //任务模式 复位执行数据 复位 控制命令 控制命令反馈 命令执行结果  
	int getCtrCmdExecResult(int nCmd);                   //遥控模式 获取控制命令执行结果
	int getTaskExecResult(int nCmd);                     //任务模式 获取任务命令执行结果
	int waitForExecResult(int nCmd);                     //遥控模式 等待持续任务命令执行结果
	int waitForTaskExecResult(int nCmd);                 //任务模式 等待自动任务的命令执行结果
	int writeData(QVector<int> vecArray);                //任务模式 批量写任务数据
	int writeData(QVector<int> vecArray, QVector<int> vecIndex);  //任务模式 批量写任务数据  持续巡检项序号
	QString GetDevStateStr(UINT64 nData);                //获取设备状态字符串
	QString GetDevAlarmStr(UINT64 nData);                //获取设备报警字符串
	void saveCsvData(QString sPath, QString sFileNane, QString sOutStr, QString sTitle);
	bool IsHaveData(QString sPath, QString sFileNane);
	CModBusOper *m_pModBusOper;                //Modbus操作对象
	CDevDataBase *m_pDevDataRob;
	int m_nCtrCmdCurr;                         //当前控制命令
	int m_nErrCount;//读测点失败次数
	int m_nOldObstacleValue;//上一次写的避障值
	bool m_bPlcState;
	bool m_bFrist;//是否软件首次开启
};

#endif